/**
 * token.js - JWT令牌验证模块
 * 
 * 用于验证API请求中的JWT令牌，确保请求的合法性
 */

const jwt = require('jsonwebtoken');

// JWT密钥，应该存储在环境变量中，这里为了简化直接写在代码里
const JWT_SECRET = 'zhuanz-secret-key';

/**
 * 生成JWT令牌
 * @param {Object} payload 令牌负载数据
 * @param {Number} expiresIn 过期时间(秒)，默认24小时
 * @returns {String} JWT令牌
 */
function generateToken(payload, expiresIn = 86400) {
  return jwt.sign(payload, JWT_SECRET, { expiresIn });
}

/**
 * 验证JWT令牌
 * @param {String} token 要验证的令牌
 * @returns {Object|null} 解码后的负载数据，验证失败返回null
 */
function verifyToken(token) {
  if (!token) return null;
  
  try {
    return jwt.verify(token, JWT_SECRET);
  } catch (error) {
    console.error('Token验证失败:', error.message);
    return null;
  }
}

/**
 * 从请求头中获取并验证令牌
 * @param {Object} ctx Koa上下文对象
 * @returns {Object|null} 解码后的负载数据，验证失败返回null
 */
function verifyTokenFromHeader(ctx) {
  const authHeader = ctx.headers.authorization;
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return null;
  }
  
  const token = authHeader.split(' ')[1];
  return verifyToken(token);
}

/**
 * 验证管理员权限中间件
 * @param {Object} ctx Koa上下文对象
 * @param {Function} next 下一个中间件
 */
async function adminAuth(ctx, next) {
  const decoded = verifyTokenFromHeader(ctx);
  
  if (!decoded || decoded.role !== 'admin') {
    ctx.status = 401;
    ctx.body = { code: 401, message: '未授权访问' };
    return;
  }
  
  // 将解码后的用户信息添加到上下文中
  ctx.state.user = decoded;
  await next();
}

/**
 * 验证用户登录中间件(普通用户或管理员都可以)
 * @param {Object} ctx Koa上下文对象
 * @param {Function} next 下一个中间件
 */
async function userAuth(ctx, next) {
  const decoded = verifyTokenFromHeader(ctx);
  
  if (!decoded) {
    ctx.status = 401;
    ctx.body = { code: 401, message: '请先登录' };
    return;
  }
  
  // 将解码后的用户信息添加到上下文中
  ctx.state.user = decoded;
  await next();
}

module.exports = {
  generateToken,
  verifyToken,
  verifyTokenFromHeader,
  adminAuth,
  userAuth
}; 